www.gusucode.com > 串口测试程序,用于调试rs485接口 串口通信的程序 > 串口测试程序,用于调试rs485接口 串口通信的程序/commtest/MPTran.cpp
// MPTran.cpp: implementation of the CMPTran class. // ////////////////////////////////////////////////////////////////////// #include "StdAfx.h" #include "MPTran.h" #include <stdlib.h> #include <string.h> #include <stdio.h> ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CMPTran::CMPTran() { } CMPTran::~CMPTran() { } int CMPTran::GetTranItem(int Item_data,BYTE Flags) { int data = Item_data & 0xFFFF;//bit15 bit14 == 1 表示设置,==0 表示查询 char LoBYTE = Item_data & 0xFF; char HiBYTE = ( Item_data & 0xFF00 ) >> 8; char LoBCD = LoBYTE & 0x0F; char HiBCD = (LoBYTE & 0xF0) >> 4; #ifdef DBUG_PRO printf("\r\nITEM%x",HiBYTE); #endif data = 0; switch(HiBYTE & 0xFF) { case 0x90: data = 0x0100 + (LoBYTE & 0xF0) + ((LoBCD + 1) & 0x0F); break; case 0x91: data = 0x0120 + (LoBYTE & 0xF0) + ((LoBCD + 1) & 0x0F); break; case 0xA0: case 0xB0: data = 0x0140 + (LoBYTE & 0xF0) + ((LoBCD + 1) & 0x0F); break; case 0x94: data = 0x0200 + (LoBYTE & 0xF0) + ((LoBCD + 1) & 0x0F); break; case 0x95: data = 0x0200 + (LoBYTE & 0xF0) + ((LoBCD + 1) & 0x0F); break; case 0xA4: case 0xB4: data = 0x0240 + (LoBYTE & 0xF0) + ((LoBCD + 1) & 0x0F); break; case 0xB3: if(HiBCD == 2) { data = 0x0310 + ((LoBCD + 1) & 0x0F); } break; case 0xB6: data = 0x0400; break; case 0xC3: if(HiBCD ==3) { data = 0x0710; } break; } #ifdef DBUG_PRO printf("\r\nDATA%x",data); #endif return data; } int CMPTran::FormCheckClock(BYTE *buff,time_t *m_time , BYTE * addr)//设置电表时钟 { return 0; } int CMPTran::FormReadDataFrame(BYTE *buff, int item , BYTE * addr) { return CMPZJ::FormReadDataFrame(buff, GetTranItem(item,0) , addr); } int CMPTran::FormSetAddress(BYTE *buff, BYTE *addr)//设置电表地址 { return 0; } int CMPTran::ProcReturnedFrame(BYTE *inbuff, int inLen,int &item, BYTE *outbuff,int &outlen,BYTE *addr)//返回数据的处理 { int m = CMPZJ::ProcReturnedFrame(inbuff, inLen,GetTranItem(item,0), outbuff,outlen,addr); if( m != 0) return m; if(outlen == 0) return 0; BYTE buf[256]; long i,j; switch( item ) { case 0xA01F: case 0xA02F: outlen = 15; for(i = 0;i < 5;i++) { memcpy(&buf[3 *i],&outbuff[7 * i],3); } memcpy(outbuff,buf,15); break; case 0xB01F: case 0xB02F: outlen = 20; for(i = 0;i < 5;i++) { memcpy(&buf[4 *i],&outbuff[7 * i + 3],4); } memcpy(outbuff,buf,20); break; case 0xB61F: if(addr[1] == 0x03)//三相三线 { buf[0] = outbuff[12];buf[1] = outbuff[13];//A相电压 buf[2] = 0;buf[3] = 0; buf[4] = outbuff[14];buf[5] = outbuff[15];//C相电压 } else { memcpy(buf,&outbuff[12],6); } memcpy(outbuff,buf,6); outlen = 6; break; case 0xB62F: if(addr[1] == 0x03)//三相三线 { buf[0] = outbuff[18];buf[1] = outbuff[19];//A相电流 buf[2] = 0;buf[3] = 0; buf[4] = outbuff[20];buf[5] = outbuff[21];//C相电流 } else { memcpy(buf,&outbuff[18],6); } memcpy(outbuff,buf,6); outlen = 6; break; case 0xB63F://有功功率 i = TranBcdToHex(outbuff[0]) + TranBcdToHex(outbuff[1]) * 100 + TranBcdToHex(outbuff[2]) *10000; j = TranBcdToHex(outbuff[3]) + TranBcdToHex(outbuff[4]) * 100 + TranBcdToHex(outbuff[5]) *10000; i -= j; outbuff[0] = TranHexToBcd(i & 0xFF); outbuff[1] = TranHexToBcd((i >> 8 ) & 0xFF); outbuff[2] = TranHexToBcd((i >> 16) & 0xFF); memset(&outbuff[3],0xFF,9); outlen = 12; break; case 0xB64F://无功功率 i = TranBcdToHex(outbuff[6]) + TranBcdToHex(outbuff[ 7]) * 100 + TranBcdToHex(outbuff[ 8]) *10000; j = TranBcdToHex(outbuff[9]) + TranBcdToHex(outbuff[10]) * 100 + TranBcdToHex(outbuff[11]) *10000; i -= j; outbuff[0] = TranHexToBcd(i & 0xFF); outbuff[1] = TranHexToBcd((i >> 8 ) & 0xFF); memset(&outbuff[2],0xFF,6); outlen = 8; break; case 0xB65F: outlen = 0; break; } return 0; } /* TRANITEM [100] = { {0x9010,0x111},{0x9011,0x112},{0x9012,0x113},{0x9013,0x114},{0x9014,0x115},{0x901F,0x110},//当前正向有功电量 {0x9020,0x121},{0x9021,0x122},{0x9022,0x123},{0x9023,0x124},{0x9024,0x125},{0x902F,0x120}, {0x9110,0x131},{0x9111,0x132},{0x9112,0x133},{0x9113,0x134},{0x9114,0x135},{0x911F,0x130}, {0x9120,0x141},{0x9121,0x142},{0x9122,0x143},{0x9123,0x144},{0x9124,0x145},{0x912F,0x140}, {0xA010,0x151},{0xA011,0x152},{0xA012,0x153},{0xA013,0x154},{0xA014,0x155},{0xA01F,0x150},//当前需量最大值 {0xA020,0x161},{0xA021,0x162},{0xA022,0x163},{0xA023,0x164},{0xA024,0x165},{0xA02F,0x160},//“”“”“”“”“” {0xB010,0x151},{0xB011,0x152},{0xB012,0x153},{0xB013,0x154},{0xB014,0x155},{0xB01F,0x150},//需量时间 {0xB020,0x161},{0xB021,0x162},{0xB022,0x163},{0xB023,0x164},{0xB024,0x165},{0xB02F,0x160},//"""""""""" {0x9410,0x211},{0x9411,0x212},{0x9412,0x213},{0x9413,0x214},{0x9414,0x215},{0x941F,0x210}, {0x9420,0x221},{0x9421,0x222},{0x9422,0x223},{0x9423,0x224},{0x9424,0x225},{0x942F,0x220}, {0x9510,0x231},{0x9511,0x232},{0x9512,0x233},{0x9513,0x234},{0x9514,0x235},{0x951F,0x230}, {0x9520,0x241},{0x9521,0x242},{0x9522,0x243},{0x9523,0x244},{0x9524,0x245},{0x952F,0x240}, {0xA410,0x251},{0xA411,0x252},{0xA412,0x253},{0xA413,0x254},{0xA414,0x255},{0xA41F,0x250},//上月需量最大值 {0xA420,0x261},{0xA421,0x262},{0xA422,0x263},{0xA423,0x264},{0xA424,0x265},{0xA42F,0x260}, {0xB410,0x251},{0xB425,0x252},{0xB412,0x253},{0xB413,0x254},{0xB414,0x255},{0xB41F,0x250},//上月需量时间 {0xB420,0x261},{0xB421,0x262},{0xB422,0x263},{0xB423,0x264},{0xB424,0x265},{0xB42F,0x260}, {0xB320,0x311},{0xB321,0x312},{0xB322,0x313},{0xB323,0x314}, {0xB32F,0x310},//失压 {0xB611,0x400},{0xB612,0x400},{0xB613,0x400},{0xB61F,0x400},//瞬时量电压 {0xB621,0x400},{0xB622,0x400},{0xB623,0x400},{0xB62F,0x400},//电流 {0xB630,0x400}, {0xB63F,0x400}, {0xB640,0x400}, {0xB64F,0x400} }; */